<!doctype html>
<html lang="zh-CN">
<head>
  <base href="https://www.nodeapp.cn/debugger.html" />
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>调试器 | Node.js 中文文档 | Node.js 中文网</title>
  <meta name="description" content="Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型，使其轻量又高效。Node.js 的包管理器 npm，是全球最大的开源库生态系统。">
  <link rel="stylesheet" href="assets/style.css">
  <link rel="stylesheet" href="assets/sh.css">
  <link rel="canonical" href="https://www.nodeapp.cn/debugger.html">
  <link rel="apple-touch-icon" href="apple-touch-icon.png">
  <link rel="icon" sizes="32x32" type="image/png" href="favicon.png">
  
  <script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?acdf78480f7f8f2b23b812565a5868e0";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

</head>
<body class="alt apidoc" id="api-section-debugger">
  <div id="content" class="clearfix">
    <div id="column1" data-id="debugger" class="interior">
      <header>
        <h1>Node.js v8.x 中文文档</h1>
        <hr>
      </header>

      <div id="toc">
        <h2>目录</h2>
        <ul>
<li><span class="stability_2"><a href="#debugger_debugger">debugger 调试器</a></span><ul>
<li><span class="stability_undefined"><a href="#debugger_watchers">监视器</a></span></li>
<li><span class="stability_undefined"><a href="#debugger_command_reference">命令参考手册</a></span><ul>
<li><span class="stability_undefined"><a href="#debugger_stepping">步进</a></span></li>
<li><span class="stability_undefined"><a href="#debugger_breakpoints">断点</a></span></li>
<li><span class="stability_undefined"><a href="#debugger_information">信息</a></span></li>
<li><span class="stability_undefined"><a href="#debugger_execution_control">执行控制</a></span></li>
<li><span class="stability_undefined"><a href="#debugger_various">杂项</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#debugger_advanced_usage">高级用法</a></span><ul>
<li><span class="stability_undefined"><a href="#debugger_v8_inspector_integration_for_node_js">Node.js 的 V8 检查器集合</a></span></li>
</ul>
</li>
</ul>
</li>
</ul>

      </div>
<div id="apicontent">
        <h1>debugger 调试器<span><a class="mark" href="#debugger_debugger" id="debugger_debugger">#</a></span></h1>
<div class="api_stability api_stability_2"><a href="documentation.html#documentation_stability_index">稳定性: 2</a> - 稳定的</div><!-- type=misc -->
<p>Node.js 包含一个进程外的调试工具，可以通过<a href="#debugger_v8_inspector_integration_for_node_js">V8检查器</a>与内置的调试客户端访问。
要使用它，需要以 <code>inspect</code> 参数启动 Node.js，并带上需要调试的脚本的路径；然后会出现一个提示，表明已成功启动调试器：</p>
<pre><code class="lang-txt">$ node inspect myscript.js
&lt; Debugger listening on ws://127.0.0.1:9229/80e7a814-7cd3-49fb-921a-2e02228cd5ba
&lt; For help see https://nodejs.org/en/docs/inspector
&lt; Debugger attached.
Break on start in myscript.js:1
&gt; 1 (function (exports, require, module, __filename, __dirname) { global.x = 5;
  2 setTimeout(() =&gt; {
  3   console.log(&apos;world&apos;);
debug&gt;
</code></pre>
<p>Node.js 的调试器客户端还未支持全部特性，但可以做些简单的步骤和检测。</p>
<p>在脚本的源代码中插入 <code>debugger;</code> 语句，则会在代码的那个位置启用一个断点：</p>
<!-- eslint-disable no-debugger -->
<pre><code class="lang-js">// myscript.js
global.x = 5;
setTimeout(() =&gt; {
  debugger;
  console.log(&apos;世界&apos;);
}, 1000);
console.log(&apos;你好&apos;);
</code></pre>
<p>一旦运行调试器，则在第 3 行会出现一个断点：</p>
<p>$ node inspect myscript.js
&lt; Debugger listening on ws://127.0.0.1:9229/80e7a814-7cd3-49fb-921a-2e02228cd5ba
&lt; For help see <a href="https://nodejs.org/en/docs/inspector">https://nodejs.org/en/docs/inspector</a>
&lt; Debugger attached.
Break on start in myscript.js:1</p>
<blockquote>
<p>1 (function (exports, require, module, <strong>filename, </strong>dirname) <span class="type">&lt;global.x = 5;
  2 setTimeout(() =&gt; {
  3   debugger;
debug&gt; cont
&lt; 你好
break in myscript.js:3
  1 (function (exports, require, module, <strong>filename, </strong>dirname) { global.x = 5;
  2 setTimeout(() =&gt; {
3   debugger;
  4   console.log(&apos;世界&apos;);
  5&gt;</span>, 1000);
debug&gt; next
break in myscript.js:4
  2 setTimeout(() =&gt; <span class="type">&lt;3   debugger;
4   console.log(&apos;世界&apos;);
  5&gt;</span>, 1000);
  6 console.log(&apos;你好&apos;);
debug&gt; repl
Press Ctrl + C to leave debug repl
x
5
2+2
4
debug&gt; next
&lt; 世界
break in myscript.js:5
  3   debugger;
  4   console.log(&apos;世界&apos;);
5 }, 1000);
  6 console.log(&apos;你好&apos;);
  7
debug&gt; .exit
<code>`</code></p>
</blockquote>
<p><code>repl</code> 命令用于运行代码。
<code>next</code> 命令用于步入下一行。
输入 <code>help</code> 可查看其他可用的命令。</p>
<p>按下 <code>enter</code> 键且不输入命令，则可重复上一个调试命令。</p>
<h2>监视器<span><a class="mark" href="#debugger_watchers" id="debugger_watchers">#</a></span></h2>
<p>可以在调试时监视表达式和变量的值。
在每个断点上，监视器列表中的每个表达式都会在当前上下文中被执行，并在断点的源代码列表之前立即显示。</p>
<p>输入 <code>watch(&apos;my_expression&apos;)</code> 开始监视一个表达式。
<code>watchers</code> 命令会打印已激活的监视器。
输入 <code>unwatch(&apos;my_expression&apos;)</code> 来移除一个监视器。</p>
<h2>命令参考手册<span><a class="mark" href="#debugger_command_reference" id="debugger_command_reference">#</a></span></h2>
<h3>步进<span><a class="mark" href="#debugger_stepping" id="debugger_stepping">#</a></span></h3>
<div class="signature"><ul>
<li><code>cont</code>, <code>c</code> - 继续执行</li>
<li><code>next</code>, <code>n</code> - 下一步</li>
<li><code>step</code>, <code>s</code> - 跳进函数</li>
<li><code>out</code>, <code>o</code> - 跳出函数</li>
<li><code>pause</code> - 暂停运行代码（类似开发者工具中的暂停按钮）</li>
</ul>
</div><h3>断点<span><a class="mark" href="#debugger_breakpoints" id="debugger_breakpoints">#</a></span></h3>
<div class="signature"><ul>
<li><code>setBreakpoint()</code>, <code>sb()</code> - 在当前行设置断点</li>
<li><code>setBreakpoint(line)</code>, <code>sb(line)</code> - 在指定行设置断点</li>
<li><code>setBreakpoint(&apos;fn()&apos;)</code>, <code>sb(...)</code> - 在函数体的第一条语句设置断点</li>
<li><code>setBreakpoint(&apos;script.js&apos;, 1)</code>, <code>sb(...)</code> - 在 script.js 的第 1 行设置断点</li>
<li><code>clearBreakpoint(&apos;script.js&apos;, 1)</code>, <code>cb(...)</code> - 清除 script.js 第 1 行的断点</li>
</ul>
</div><p>也可以在一个还未被加载的文件（模块）中设置断点：</p>
<pre><code class="lang-txt">$ node inspect main.js
&lt; Debugger listening on ws://127.0.0.1:9229/4e3db158-9791-4274-8909-914f7facf3bd
&lt; For help see https://nodejs.org/en/docs/inspector
&lt; Debugger attached.
Break on start in main.js:1
&gt; 1 (function (exports, require, module, __filename, __dirname) { const mod = require(&apos;./mod.js&apos;);
  2 mod.hello();
  3 mod.hello();
debug&gt; setBreakpoint(&apos;mod.js&apos;, 22)
Warning: script &apos;mod.js&apos; was not loaded yet.
debug&gt; c
break in mod.js:22
 20 // USE OR OTHER DEALINGS IN THE SOFTWARE.
 21
&gt;22 exports.hello = function() {
 23   return &apos;hello from module&apos;;
 24 };
debug&gt;
</code></pre>
<h3>信息<span><a class="mark" href="#debugger_information" id="debugger_information">#</a></span></h3>
<div class="signature"><ul>
<li><code>backtrace</code>, <code>bt</code> - 打印当前执行框架的回溯</li>
<li><code>list(5)</code> - 列出脚本源代码的 5 行上下文（前后各 5 行）</li>
<li><code>watch(expr)</code> - 添加表达式到监视列表</li>
<li><code>unwatch(expr)</code> - 从监视列表移除表达式</li>
<li><code>watchers</code> - 列出所有监视器和它们的值（每个断点会自动列出）</li>
<li><code>repl</code> - 打开调试器的 repl，用于在所调试的脚本的上下文中进行执行</li>
<li><code>exec expr</code> - 在所调试的脚本的上下文中执行一个表达式</li>
</ul>
</div><h3>执行控制<span><a class="mark" href="#debugger_execution_control" id="debugger_execution_control">#</a></span></h3>
<div class="signature"><ul>
<li><code>run</code> - 运行脚本（调试器开始时自动运行）</li>
<li><code>restart</code> - 重新启动脚本</li>
<li><code>kill</code> - 终止脚本</li>
</ul>
</div><h3>杂项<span><a class="mark" href="#debugger_various" id="debugger_various">#</a></span></h3>
<div class="signature"><ul>
<li><code>scripts</code> - 列出所有已加载的脚本</li>
<li><code>version</code> - 显示 V8 引擎的版本号</li>
</ul>
</div><h2>高级用法<span><a class="mark" href="#debugger_advanced_usage" id="debugger_advanced_usage">#</a></span></h2>
<h3>Node.js 的 V8 检查器集合<span><a class="mark" href="#debugger_v8_inspector_integration_for_node_js" id="debugger_v8_inspector_integration_for_node_js">#</a></span></h3>
<p>V8 的检查器集成可以附加 Chrome 的开发者工具到 Node.js 实例以用于调试和性能分析。
It uses the <a href="https://chromedevtools.github.io/debugger-protocol-viewer/">Chrome Debugging Protocol</a>.</p>
<p>当启动一个 Node.js 应用时，V8 检查器可以通过传入 <code>--inspect</code> 标志启用。
也可以通过该标志提供一个自定义的端口，如 <code>--inspect=9222</code> 会在 9222 端口接受开发者工具连接。</p>
<p>要想在应用代码的第一行断开，可以传入 <code>--inspect-brk</code> 标志而不是 <code>--inspect</code>。</p>
<pre><code class="lang-txt">$ node --inspect index.js
Debugger listening on 127.0.0.1:9229.
To start debugging, open the following URL in Chrome:
    chrome-devtools://devtools/bundled/inspector.html?experiments=true&amp;v8only=true&amp;ws=127.0.0.1:9229/dc9010dd-f8b8-4ac5-a510-c1a114ec7d29
</code></pre>
<p>(In the example above, the UUID dc9010dd-f8b8-4ac5-a510-c1a114ec7d29
at the end of the URL is generated on the fly, it varies in different
debugging sessions.)</p>

      </div>
    </div>

    <div id="column2" class="interior">
      <div id="intro" class="interior">
        <a href="/" title="Go back to the home page">
          Node.js 中文文档 | Node.js 中文网
        </a>
      </div>
      
        <!-- [start-include:_toc.md] -->
<ul>
<li><a href="documentation.html">关于本文档</a></li>
<li><a href="synopsis.html">用法与例子</a></li>
</ul>
<div class="line"></div>

<ul>
<li><a href="assert.html">断言测试</a></li>
<li><a href="async_hooks.html">异步钩子（Async Hooks）</a></li>
<li><a href="buffer.html">缓存（Buffer）</a></li>
<li><a href="addons.html">C++ 插件</a></li>
<li><a href="n-api.html">C/C++ 插件 - N-API</a></li>
<li><a href="child_process.html">子进程</a></li>
<li><a href="cluster.html">集群（Cluster）</a></li>
<li><a href="cli.html">命令行参数</a></li>
<li><a href="console.html">控制台（Console）</a></li>
<li><a href="crypto.html">加密（Crypto）</a></li>
<li><a href="debugger.html">调试器</a></li>
<li><a href="deprecations.html">废弃的 API</a></li>
<li><a href="dns.html">DNS</a></li>
<li><a href="domain.html">域（Domain）</a></li>
<li><a href="esm.html">ECMAScript 模块</a></li>
<li><a href="errors.html">错误（Errors）</a></li>
<li><a href="events.html">事件（Events）</a></li>
<li><a href="fs.html">文件系统</a></li>
<li><a href="globals.html">全局对象（Globals）</a></li>
<li><a href="http.html">HTTP</a></li>
<li><a href="http2.html">HTTP/2</a></li>
<li><a href="https.html">HTTPS</a></li>
<li><a href="inspector.html">检查工具（Inspector）</a></li>
<li><a href="intl.html">国际化</a></li>
<li><a href="modules.html">模块（Modules）</a></li>
<li><a href="net.html">网络（Net）</a></li>
<li><a href="os.html">操作系统（OS）</a></li>
<li><a href="path.html">路径（Path）</a></li>
<li><a href="perf_hooks.html">性能钩子（Performance Hooks）</a></li>
<li><a href="process.html">进程</a></li>
<li><a href="punycode.html">Punycode</a></li>
<li><a href="querystring.html">查询字符串</a></li>
<li><a href="readline.html">逐行读取</a></li>
<li><a href="repl.html">交互式解释器（REPL）</a></li>
<li><a href="stream.html">流（Stream）</a></li>
<li><a href="string_decoder.html">字符串解码</a></li>
<li><a href="timers.html">定时器（Timers）</a></li>
<li><a href="tls.html">安全传输层（TLS/SSL）</a></li>
<li><a href="tracing.html">事件跟踪（Tracing）</a></li>
<li><a href="tty.html">TTY</a></li>
<li><a href="dgram.html">UDP / 数据报</a></li>
<li><a href="url.html">URL</a></li>
<li><a href="util.html">工具集</a></li>
<li><a href="v8.html">V8</a></li>
<li><a href="vm.html">虚拟机（VM）</a></li>
<li><a href="zlib.html">压缩（ZLIB）</a></li>
</ul>
<div class="line"></div>

<ul>
<li><a href="https://github.com/nodejs/node">GitHub 仓库和问题跟踪</a></li>
<li><a href="https://groups.google.com/group/nodejs">邮件列表</a></li>
</ul>
<!-- [end-include:_toc.md] -->

      
    </div>
  </div>
  <script src="assets/sh_main.js"></script>
  <script src="assets/sh_javascript.min.js"></script>
  <script>highlight(undefined, undefined, 'pre');</script>
</body>
</html>
